
// Function 都是字符串 js引擎解析 
// const test = new Function('a', 'b', 'c', 'console.log(a + b + c)');
// const test = new Function('a, b, c', 'console.log(a + b + c)');

// test(1, 2, 3); // 6

// this -> window
// const test = new Function('a', 'console.log(this == window)');

// test(1);




// 问题：

// var a = 1,
//     b = 2;

// function test() {
//   var b = 3;

// 这种方式创建函数不是闭包
  // return new Function('c', 'console.log(a + b + c)'); // 7
  // return function(c) { console.log(a + b + c) }; // 8
  // 使用 eval 创建函数， 要加函数名， 立即执行时 函数前面加 ！后面加 ()
  // eval('!function _ (c) { console.log(a + b + c) }(4)') // 8
// }
// test(); // 使用eval 时
// var t = test();
// t(4);
// window环境下 可以访问到全局，node环境下访问不到 a 为undefined


// Function constructor(函数构造器) & function declaration(函数声明)

// new Function()， 是用构造函数的方式去创建一个函数，
// 仅仅是创建在全局的 , 访问到的只有自身的作用域， 自身没有就会去 window(全局) 上找
// function test() {} // 是用 声明的方式 创建一个函数




var t1 = new Function('console.log("t1")');
var t2 = Function('console.log("t2")');
t1();
t2();

// 以调用函数的方式调用 Function 的构造函数(而不是使用 new 关键字)
// 跟以构造函数来调用是一样的

console.log(t1.__proto__ === Function.prototype); // true
console.log(Function.__proto__ === Function.prototype); // true
console.log(t1.toString());


var code = `function anonymous(
  ) {
  console.log("t1")
  }`;

eval(`!${code}()`);







